﻿2026-05-14T11:35:55.0121857Z ##[group]Run pnpm verify:phase-5
2026-05-14T11:35:55.0122180Z [36;1mpnpm verify:phase-5[0m
2026-05-14T11:35:55.0156394Z shell: /usr/bin/bash -e {0}
2026-05-14T11:35:55.0156647Z env:
2026-05-14T11:35:55.0156888Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-14T11:35:55.0157210Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-14T11:35:55.0157433Z   SKIP_TRACE_CHECK: 1
2026-05-14T11:35:55.0157636Z ##[endgroup]
2026-05-14T11:35:55.3153630Z 
2026-05-14T11:35:55.3162086Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-14T11:35:55.3163522Z > node scripts/verify-phase-5.mjs
2026-05-14T11:35:55.3164169Z 
2026-05-14T11:35:55.3460833Z 
2026-05-14T11:35:55.3461730Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-14T11:35:55.3462953Z >>> pnpm verify:phase-4
2026-05-14T11:35:55.6696271Z 
2026-05-14T11:35:55.6698615Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-14T11:35:55.6701363Z > node scripts/verify-phase-4.mjs
2026-05-14T11:35:55.6701707Z 
2026-05-14T11:35:55.6986831Z 
2026-05-14T11:35:55.6987365Z === Workspace: typecheck ===
2026-05-14T11:35:55.6987908Z >>> pnpm -r typecheck
2026-05-14T11:35:56.0416708Z Scope: 5 of 6 workspace projects
2026-05-14T11:35:56.0438392Z packages/db typecheck$ tsc --noEmit
2026-05-14T11:35:56.0446791Z packages/game-logic typecheck$ tsc --noEmit
2026-05-14T11:35:58.8507577Z packages/game-logic typecheck: Done
2026-05-14T11:35:58.8526753Z packages/protocol typecheck$ tsc --noEmit
2026-05-14T11:36:00.6827139Z packages/db typecheck: Done
2026-05-14T11:36:02.2601002Z packages/protocol typecheck: Done
2026-05-14T11:36:02.2607489Z apps/client typecheck$ tsc --noEmit
2026-05-14T11:36:02.2610890Z apps/server typecheck$ tsc --noEmit
2026-05-14T11:36:13.8865508Z apps/client typecheck: Done
2026-05-14T11:36:14.7730907Z apps/server typecheck: Done
2026-05-14T11:36:14.7823883Z 
2026-05-14T11:36:14.7824405Z === Lint: protocol-sync ===
2026-05-14T11:36:14.7825163Z >>> pnpm lint:protocol-sync
2026-05-14T11:36:15.0899210Z 
2026-05-14T11:36:15.0900196Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-14T11:36:15.0901411Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-14T11:36:15.0902073Z 
2026-05-14T11:36:15.1191371Z lint-protocol-sync: OK
2026-05-14T11:36:15.1308143Z 
2026-05-14T11:36:15.1308698Z === Lint: game-logic-purity ===
2026-05-14T11:36:15.1309456Z >>> pnpm lint:game-logic-purity
2026-05-14T11:36:15.4420163Z 
2026-05-14T11:36:15.4421006Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-14T11:36:15.4421870Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-14T11:36:15.4422265Z 
2026-05-14T11:36:15.4744951Z lint-game-logic-purity: OK (7 file(s) clean)
2026-05-14T11:36:15.4866887Z 
2026-05-14T11:36:15.4867818Z === Lint: better-auth-schema-sync ===
2026-05-14T11:36:15.4868692Z >>> pnpm lint:better-auth-schema-sync
2026-05-14T11:36:15.8029466Z 
2026-05-14T11:36:15.8030634Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-14T11:36:15.8031910Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-14T11:36:15.8032638Z 
2026-05-14T11:36:17.3237136Z lint-better-auth-schema-sync: OK
2026-05-14T11:36:17.3359836Z 
2026-05-14T11:36:17.3360584Z === Lint: rate-limit-budgets ===
2026-05-14T11:36:17.3361484Z >>> pnpm lint:rate-limit-budgets
2026-05-14T11:36:17.6415966Z 
2026-05-14T11:36:17.6417039Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-14T11:36:17.6417933Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-14T11:36:17.6418336Z 
2026-05-14T11:36:17.6715448Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-14T11:36:17.6834830Z 
2026-05-14T11:36:17.6835580Z === Lint: no-clipboard-rce ===
2026-05-14T11:36:17.6836981Z >>> pnpm lint:no-clipboard-rce
2026-05-14T11:36:17.9904603Z 
2026-05-14T11:36:17.9905641Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-14T11:36:17.9907284Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-14T11:36:17.9907983Z 
2026-05-14T11:36:18.0250014Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-14T11:36:18.0366967Z 
2026-05-14T11:36:18.0367497Z === Lint: room-layout ===
2026-05-14T11:36:18.0368372Z >>> pnpm lint:room-layout
2026-05-14T11:36:18.3450071Z 
2026-05-14T11:36:18.3451079Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-14T11:36:18.3452123Z > node tools/scripts/lint-room-layout.mjs
2026-05-14T11:36:18.3452749Z 
2026-05-14T11:36:18.3788809Z lint-room-layout: OK
2026-05-14T11:36:18.3907323Z 
2026-05-14T11:36:18.3908010Z === ADR 0004 lint ===
2026-05-14T11:36:18.3908895Z >>> pnpm lint:adr:0004
2026-05-14T11:36:18.6961430Z 
2026-05-14T11:36:18.6962432Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-14T11:36:18.6963972Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-14T11:36:18.6964968Z 
2026-05-14T11:36:18.7275201Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-14T11:36:18.7392677Z 
2026-05-14T11:36:18.7393370Z === Drizzle: emit-check ===
2026-05-14T11:36:18.7394209Z >>> pnpm db:emit-check
2026-05-14T11:36:19.0459364Z 
2026-05-14T11:36:19.0460379Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-14T11:36:19.0463460Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-14T11:36:19.0465665Z 
2026-05-14T11:36:19.4993042Z No config path provided, using default 'drizzle.config.ts'
2026-05-14T11:36:19.4995391Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-14T11:36:19.8989543Z 8 tables
2026-05-14T11:36:19.8990329Z accounts 8 columns 1 indexes 0 fks
2026-05-14T11:36:19.8991261Z audit_log 6 columns 0 indexes 2 fks
2026-05-14T11:36:19.8992162Z characters 9 columns 0 indexes 1 fks
2026-05-14T11:36:19.8993053Z inventory_items 4 columns 0 indexes 1 fks
2026-05-14T11:36:19.8994118Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-14T11:36:19.8994984Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-14T11:36:19.8995859Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-14T11:36:19.8997055Z sessions 5 columns 0 indexes 1 fks
2026-05-14T11:36:19.8997612Z 
2026-05-14T11:36:19.8998459Z No schema changes, nothing to migrate 😴
2026-05-14T11:36:20.0061088Z 
2026-05-14T11:36:20.0061878Z === Drizzle: schema-sync ===
2026-05-14T11:36:20.0062606Z >>> pnpm lint:schema-sync
2026-05-14T11:36:20.3285582Z 
2026-05-14T11:36:20.3286812Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-14T11:36:20.3290469Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-14T11:36:20.3293278Z 
2026-05-14T11:36:20.3561677Z OK
2026-05-14T11:36:20.3686270Z 
2026-05-14T11:36:20.3687056Z === Drizzle: source-comments ===
2026-05-14T11:36:20.3687797Z >>> pnpm lint:source-comments
2026-05-14T11:36:20.6751820Z 
2026-05-14T11:36:20.6752844Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-14T11:36:20.6754080Z > pnpm -C packages/db run lint:source-comments
2026-05-14T11:36:20.6754798Z 
2026-05-14T11:36:20.9850012Z 
2026-05-14T11:36:20.9851185Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-14T11:36:20.9852477Z > node scripts/check-source-comments.mjs
2026-05-14T11:36:20.9853089Z 
2026-05-14T11:36:21.0151078Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-14T11:36:21.0360656Z 
2026-05-14T11:36:21.0361427Z === Workspace: test ===
2026-05-14T11:36:21.0362166Z >>> pnpm -r test
2026-05-14T11:36:21.3501632Z Scope: 5 of 6 workspace projects
2026-05-14T11:36:21.3562657Z packages/db test$ vitest run
2026-05-14T11:36:21.3571845Z packages/game-logic test$ vitest run
2026-05-14T11:36:21.8625417Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-14T11:36:21.8829245Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-14T11:36:22.3176686Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-14T11:36:22.5792907Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T11:36:22.8194693Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T11:36:22.8588345Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-14T11:36:23.0563792Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:36:23.2963319Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T11:36:23.5198343Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T11:36:23.7328463Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:36:23.7417552Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T11:36:23.9608156Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:36:23.9698198Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:36:23.9777353Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-14T11:36:23.9837309Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-14T11:36:23.9838608Z packages/db test: [2m   Start at [22m 11:36:21
2026-05-14T11:36:23.9877698Z packages/db test: [2m   Duration [22m 2.10s[2m (transform 154ms, setup 0ms, import 1.44s, tests 29ms, environment 1ms)[22m
2026-05-14T11:36:24.0097721Z packages/db test: Done
2026-05-14T11:36:24.0111374Z packages/protocol test$ vitest run
2026-05-14T11:36:24.1868186Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:36:24.4408260Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:36:24.4494778Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-14T11:36:24.4524672Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-14T11:36:24.4617140Z packages/game-logic test: [2m   Start at [22m 11:36:21
2026-05-14T11:36:24.4707650Z packages/game-logic test: [2m   Duration [22m 2.55s[2m (transform 240ms, setup 0ms, import 432ms, tests 92ms, environment 2ms)[22m
2026-05-14T11:36:24.4938471Z packages/game-logic test: Done
2026-05-14T11:36:24.5265781Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-14T11:36:24.8200558Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T11:36:24.9787233Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T11:36:25.1428484Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:36:25.2975593Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T11:36:25.3020448Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-14T11:36:25.3024733Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-14T11:36:25.3026377Z packages/protocol test: [2m   Start at [22m 11:36:24
2026-05-14T11:36:25.3028182Z packages/protocol test: [2m   Duration [22m 767ms[2m (transform 108ms, setup 0ms, import 221ms, tests 32ms, environment 0ms)[22m
2026-05-14T11:36:25.3314520Z packages/protocol test: Done
2026-05-14T11:36:25.3319750Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-14T11:36:25.3322147Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-14T11:36:25.8768913Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-14T11:36:25.9434139Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-14T11:36:26.9613303Z apps/server test: {"level":30,"time":1778758586959,"pid":4692,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-14T11:36:26.9661431Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 783[2mms[22m[39m
2026-05-14T11:36:26.9663459Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 606[2mms[22m[39m
2026-05-14T11:36:27.8938752Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-14T11:36:27.8944453Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-14T11:36:27.9744011Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 245[2mms[22m[39m
2026-05-14T11:36:28.2670164Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 66[2mms[22m[39m
2026-05-14T11:36:29.1969768Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 144[2mms[22m[39m
2026-05-14T11:36:29.2339261Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-14T11:36:29.2357257Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-NGRYgd/rebno.db
2026-05-14T11:36:29.2362284Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T11:36:29.2363830Z apps/server test: [run-migrations] OK
2026-05-14T11:36:29.2458524Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-14T11:36:29.2460970Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-0i2DO3/rebno.db
2026-05-14T11:36:29.2469227Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T11:36:29.2473367Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-14T11:36:29.2476587Z apps/server test: [run-migrations] OK
2026-05-14T11:36:29.2533558Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T11:36:29.2559157Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-ExEAfv/rebno.db
2026-05-14T11:36:29.2571399Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T11:36:29.2572787Z apps/server test: [run-migrations] OK
2026-05-14T11:36:29.2577576Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T11:36:29.2581613Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-ExEAfv/rebno.db
2026-05-14T11:36:29.2606647Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T11:36:29.2608023Z apps/server test: [run-migrations] OK
2026-05-14T11:36:29.2657540Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 48[2mms[22m[39m
2026-05-14T11:36:29.5527520Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-14T11:36:29.8634936Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-14T11:36:30.1488438Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-14T11:36:30.3611882Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 62[2mms[22m[39m
2026-05-14T11:36:30.3978143Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:36:30.6483329Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-14T11:36:30.9302660Z apps/server test: {"level":40,"time":1778758590927,"pid":4839,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T11:36:30.9370958Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-14T11:36:30.9432645Z apps/server test: {"level":40,"time":1778758590931,"pid":4839,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T11:36:30.9477649Z apps/server test: {"level":40,"time":1778758590932,"pid":4839,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T11:36:31.7531679Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 149[2mms[22m[39m
2026-05-14T11:36:31.7720691Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-14T11:36:31.7737940Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌁ auth for agents [www.vestauth.com]
2026-05-14T11:36:31.7757212Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-14T11:36:32.5693367Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:36:32.8088249Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T11:36:32.8142363Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-14T11:36:32.8160062Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-14T11:36:32.8177328Z apps/server test: [2m   Start at [22m 11:36:25
2026-05-14T11:36:32.8190664Z apps/server test: [2m   Duration [22m 6.92s[2m (transform 512ms, setup 0ms, import 3.49s, tests 1.01s, environment 2ms)[22m
2026-05-14T11:36:32.8652068Z apps/server test: Done
2026-05-14T11:36:32.9019997Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 103[2mms[22m[39m
2026-05-14T11:36:33.6267071Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 74[2mms[22m[39m
2026-05-14T11:36:34.3615837Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 70[2mms[22m[39m
2026-05-14T11:36:35.0568491Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 33[2mms[22m[39m
2026-05-14T11:36:35.7512726Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-14T11:36:36.4331493Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-14T11:36:37.1372691Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T11:36:37.8156487Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:36:38.5590460Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T11:36:39.2290341Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T11:36:39.8970311Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:36:40.5587045Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:36:41.2411471Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T11:36:41.9070571Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:36:42.5875062Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:36:43.2512130Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:36:43.9412560Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:36:44.6173055Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:36:45.2720191Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:36:45.9559817Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T11:36:46.6434272Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T11:36:47.3101983Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T11:36:47.3309014Z apps/client test: [2m Test Files [22m [1m[32m26 passed[39m[22m[90m (26)[39m
2026-05-14T11:36:47.3325178Z apps/client test: [2m      Tests [22m [1m[32m193 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (197)[39m
2026-05-14T11:36:47.3326932Z apps/client test: [2m   Start at [22m 11:36:25
2026-05-14T11:36:47.3331874Z apps/client test: [2m   Duration [22m 21.39s[2m (transform 830ms, setup 62ms, collect 1.24s, tests 1.02s, environment 12.58s, prepare 2.34s)[22m
2026-05-14T11:36:47.4682008Z apps/client test: Done
2026-05-14T11:36:47.4760120Z 
2026-05-14T11:36:47.4760730Z verify-phase-4: OK (12 steps green)
2026-05-14T11:36:47.4876650Z 
2026-05-14T11:36:47.4876993Z === Workspace: typecheck ===
2026-05-14T11:36:47.4877528Z >>> pnpm -r typecheck
2026-05-14T11:36:47.7993980Z Scope: 5 of 6 workspace projects
2026-05-14T11:36:47.8051331Z packages/db typecheck$ tsc --noEmit
2026-05-14T11:36:47.8060864Z packages/game-logic typecheck$ tsc --noEmit
2026-05-14T11:36:50.3614790Z packages/game-logic typecheck: Done
2026-05-14T11:36:50.3673149Z packages/protocol typecheck$ tsc --noEmit
2026-05-14T11:36:52.5916716Z packages/db typecheck: Done
2026-05-14T11:36:53.9200359Z packages/protocol typecheck: Done
2026-05-14T11:36:53.9208119Z apps/client typecheck$ tsc --noEmit
2026-05-14T11:36:53.9210888Z apps/server typecheck$ tsc --noEmit
2026-05-14T11:37:05.4767191Z apps/client typecheck: Done
2026-05-14T11:37:06.4847779Z apps/server typecheck: Done
2026-05-14T11:37:06.4942760Z 
2026-05-14T11:37:06.4943279Z === Lint: deploy-stack ===
2026-05-14T11:37:06.4943977Z >>> pnpm lint:deploy-stack
2026-05-14T11:37:06.7984371Z 
2026-05-14T11:37:06.7985308Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-14T11:37:06.7987123Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-14T11:37:06.7987651Z 
2026-05-14T11:37:06.8288792Z lint-deploy-stack: OK
2026-05-14T11:37:06.8419039Z 
2026-05-14T11:37:06.8419852Z === Lint: deploy-stack test ===
2026-05-14T11:37:06.8420579Z >>> pnpm lint:deploy-stack:test
2026-05-14T11:37:07.1520766Z 
2026-05-14T11:37:07.1521780Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-14T11:37:07.1522857Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-14T11:37:07.1523418Z 
2026-05-14T11:37:07.2163764Z PASS: lint-deploy-stack green
2026-05-14T11:37:07.2283999Z 
2026-05-14T11:37:07.2284473Z === ADR 0005 lint ===
2026-05-14T11:37:07.2285041Z >>> pnpm lint:adr:0005
2026-05-14T11:37:07.5380769Z 
2026-05-14T11:37:07.5381708Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-14T11:37:07.5383039Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-14T11:37:07.5383911Z 
2026-05-14T11:37:07.5675263Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-14T11:37:07.5786709Z 
2026-05-14T11:37:07.5787096Z === ADR 0006 lint ===
2026-05-14T11:37:07.5787697Z >>> pnpm lint:adr:0006
2026-05-14T11:37:07.8801241Z 
2026-05-14T11:37:07.8802230Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-14T11:37:07.8803591Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-14T11:37:07.8804483Z 
2026-05-14T11:37:07.9110772Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-14T11:37:07.9220755Z 
2026-05-14T11:37:07.9221192Z === Workspace: test ===
2026-05-14T11:37:07.9221748Z >>> pnpm -r test
2026-05-14T11:37:08.2406773Z Scope: 5 of 6 workspace projects
2026-05-14T11:37:08.2464563Z packages/db test$ vitest run
2026-05-14T11:37:08.2474136Z packages/game-logic test$ vitest run
2026-05-14T11:37:08.7503090Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-14T11:37:08.7520711Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-14T11:37:09.1641209Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T11:37:09.4206565Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T11:37:09.6604251Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T11:37:09.7308641Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T11:37:09.8979190Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:37:10.1154136Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:37:10.3275263Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T11:37:10.5514343Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:37:10.6244639Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T11:37:10.7748083Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:37:10.8768195Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:37:10.8797348Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-14T11:37:10.8819867Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-14T11:37:10.8833948Z packages/db test: [2m   Start at [22m 11:37:08
2026-05-14T11:37:10.8860994Z packages/db test: [2m   Duration [22m 2.12s[2m (transform 186ms, setup 0ms, import 1.46s, tests 32ms, environment 1ms)[22m
2026-05-14T11:37:10.9104495Z packages/db test: Done
2026-05-14T11:37:10.9119017Z packages/protocol test$ vitest run
2026-05-14T11:37:10.9954961Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:37:11.2658296Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-14T11:37:11.2747352Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-14T11:37:11.2777573Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-14T11:37:11.2815216Z packages/game-logic test: [2m   Start at [22m 11:37:08
2026-05-14T11:37:11.2817519Z packages/game-logic test: [2m   Duration [22m 2.51s[2m (transform 230ms, setup 0ms, import 425ms, tests 92ms, environment 4ms)[22m
2026-05-14T11:37:11.3450128Z packages/game-logic test: Done
2026-05-14T11:37:11.3836494Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-14T11:37:11.6671044Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T11:37:11.8331246Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T11:37:11.9968662Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:37:12.1536467Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T11:37:12.1572026Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-14T11:37:12.1574539Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-14T11:37:12.1575961Z packages/protocol test: [2m   Start at [22m 11:37:11
2026-05-14T11:37:12.1578183Z packages/protocol test: [2m   Duration [22m 766ms[2m (transform 102ms, setup 0ms, import 223ms, tests 31ms, environment 0ms)[22m
2026-05-14T11:37:12.1858919Z packages/protocol test: Done
2026-05-14T11:37:12.1864176Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-14T11:37:12.1868095Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-14T11:37:12.7508195Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-14T11:37:12.7979786Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-14T11:37:13.7508305Z apps/server test: {"level":30,"time":1778758633744,"pid":5796,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-14T11:37:13.7547605Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 699[2mms[22m[39m
2026-05-14T11:37:13.7607617Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 569[2mms[22m[39m
2026-05-14T11:37:14.7593080Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-14T11:37:14.7611467Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-14T11:37:14.8382691Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 229[2mms[22m[39m
2026-05-14T11:37:15.0518157Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 59[2mms[22m[39m
2026-05-14T11:37:16.0045188Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 153[2mms[22m[39m
2026-05-14T11:37:16.0618956Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-14T11:37:16.0635723Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-gads7Y/rebno.db
2026-05-14T11:37:16.0642478Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T11:37:16.0643551Z apps/server test: [run-migrations] OK
2026-05-14T11:37:16.0750431Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-14T11:37:16.0762853Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-lUtjYW/rebno.db
2026-05-14T11:37:16.0765665Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T11:37:16.0769157Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-14T11:37:16.0770619Z apps/server test: [run-migrations] OK
2026-05-14T11:37:16.0838559Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T11:37:16.0857459Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-8JuJNH/rebno.db
2026-05-14T11:37:16.0859737Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T11:37:16.0871021Z apps/server test: [run-migrations] OK
2026-05-14T11:37:16.0884033Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T11:37:16.0886604Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-8JuJNH/rebno.db
2026-05-14T11:37:16.0888267Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T11:37:16.0893318Z apps/server test: [run-migrations] OK
2026-05-14T11:37:16.0985326Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 55[2mms[22m[39m
2026-05-14T11:37:16.4098080Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-14T11:37:16.6890460Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-14T11:37:17.0069424Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-14T11:37:17.2551668Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 144[2mms[22m[39m
2026-05-14T11:37:17.2844987Z apps/server test: {"level":40,"time":1778758637274,"pid":5909,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T11:37:17.2872420Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-14T11:37:17.2899093Z apps/server test: {"level":40,"time":1778758637277,"pid":5909,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T11:37:17.2901192Z apps/server test: {"level":40,"time":1778758637278,"pid":5909,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T11:37:17.5849089Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-14T11:37:17.7971493Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T11:37:18.4874012Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 163[2mms[22m[39m
2026-05-14T11:37:18.6831921Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-14T11:37:18.6844503Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ suppress logs { quiet: true }
2026-05-14T11:37:18.7138542Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-14T11:37:19.4755742Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:37:19.6151341Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 115[2mms[22m[39m
2026-05-14T11:37:19.7250953Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:37:19.7261653Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-14T11:37:19.7263672Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-14T11:37:19.7265063Z apps/server test: [2m   Start at [22m 11:37:12
2026-05-14T11:37:19.7267589Z apps/server test: [2m   Duration [22m 6.95s[2m (transform 525ms, setup 0ms, import 3.66s, tests 918ms, environment 2ms)[22m
2026-05-14T11:37:19.7747756Z apps/server test: Done
2026-05-14T11:37:20.4113418Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 76[2mms[22m[39m
2026-05-14T11:37:21.1268022Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 41[2mms[22m[39m
2026-05-14T11:37:21.8314191Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 33[2mms[22m[39m
2026-05-14T11:37:22.5230934Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-14T11:37:23.2154717Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T11:37:23.9058107Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T11:37:24.6825058Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T11:37:25.3535564Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T11:37:26.0349013Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:37:26.7025484Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:37:27.3574554Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T11:37:28.0228440Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T11:37:28.6855614Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T11:37:29.3622394Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:37:30.0340101Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:37:30.6990403Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:37:31.3660051Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:37:32.0450777Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:37:32.7229295Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T11:37:33.3995372Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T11:37:34.0661131Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T11:37:34.0877861Z apps/client test: [2m Test Files [22m [1m[32m26 passed[39m[22m[90m (26)[39m
2026-05-14T11:37:34.0884728Z apps/client test: [2m      Tests [22m [1m[32m193 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (197)[39m
2026-05-14T11:37:34.0904986Z apps/client test: [2m   Start at [22m 11:37:12
2026-05-14T11:37:34.0906831Z apps/client test: [2m   Duration [22m 21.29s[2m (transform 767ms, setup 62ms, collect 1.19s, tests 1.10s, environment 12.43s, prepare 2.34s)[22m
2026-05-14T11:37:34.2246554Z apps/client test: Done
2026-05-14T11:37:34.2325171Z 
2026-05-14T11:37:34.2326411Z verify-phase-5: OK (7 steps green)
